"""
文件接收器 (File Ingestor)
负责接收用户上传的PDF文件并进行基本验证
"""

import os
import mimetypes
from pathlib import Path
from typing import Optional, Dict, Any
from loguru import logger


class FileIngestor:
    """文件接收器类"""
    
    def __init__(self, max_file_size: int = 100 * 1024 * 1024):  # 100MB
        """
        初始化文件接收器
        
        Args:
            max_file_size: 最大文件大小限制（字节）
        """
        self.max_file_size = max_file_size
        self.supported_formats = ['.pdf']
        
    def validate_file(self, file_path: str) -> Dict[str, Any]:
        """
        验证文件是否符合要求
        
        Args:
            file_path: 文件路径
            
        Returns:
            验证结果字典
        """
        result = {
            'is_valid': False,
            'error': None,
            'file_path': None,
            'file_info': None
        }
        
        try:
            # 检查文件是否存在
            if not os.path.exists(file_path):
                result['error'] = f"文件不存在: {file_path}"
                return result
            
            # 获取文件信息
            file_path_obj = Path(file_path)
            file_size = file_path_obj.stat().st_size
            file_extension = file_path_obj.suffix.lower()
            
            # 检查文件格式
            if file_extension not in self.supported_formats:
                result['error'] = f"不支持的文件格式: {file_extension}，支持的格式: {self.supported_formats}"
                return result
            
            # 检查文件大小
            if file_size > self.max_file_size:
                result['error'] = f"文件过大: {file_size / 1024 / 1024:.2f}MB，最大限制: {self.max_file_size / 1024 / 1024:.2f}MB"
                return result
            
            # 检查MIME类型
            mime_type, _ = mimetypes.guess_type(file_path)
            if mime_type != 'application/pdf':
                result['error'] = f"文件MIME类型不正确: {mime_type}"
                return result
            
            # 验证通过
            result['is_valid'] = True
            result['file_path'] = str(file_path_obj.absolute())
            result['file_info'] = {
                'file_path': str(file_path_obj.absolute()),
                'file_name': file_path_obj.name,
                'file_size': file_size,
                'file_extension': file_extension,
                'mime_type': mime_type
            }
            
            logger.info(f"文件验证通过: {file_path}")
            
        except Exception as e:
            result['error'] = f"文件验证过程中发生错误: {str(e)}"
            logger.error(f"文件验证失败: {file_path}, 错误: {str(e)}")
        
        return result
    
    def ingest_file(self, file_path: str) -> Dict[str, Any]:
        """
        接收并验证文件
        
        Args:
            file_path: 文件路径
            
        Returns:
            验证结果字典
        """
        validation_result = self.validate_file(file_path)
        
        if validation_result['is_valid']:
            logger.info(f"成功接收文件: {file_path}")
        else:
            logger.error(f"文件接收失败: {validation_result['error']}")
        
        return validation_result